package com.xrh.xdemo.service.utils;


import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.swing.ImageIcon;

import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

import com.xrh.core.exceptions.BusinessException;
import com.xrh.core.utils.XAssert;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;

public class ResourceFileUtils {
	
	/**
	 * @function 获取resource资源目录下的文件,并读取内容字符串
	 * @param filePath 文件路径
	 * @author 肖荣辉
	 * @date 2023年12月20日
	*/
	public static String loadFileAndReadString(String filePath){
		
		File file = loadFile(filePath);
		
		if(file == null)
			return null;
		
		return FileUtil.readString(file , "utf-8");
	}
	
	
	/**
	 * @function 获取resource资源目录下的文件
	 * @param filePath 文件路径
	 * @author 肖荣辉
	 * @date 2023年12月20日
	*/
	public static File loadFile(String filePath){
		
		try {
			
			XAssert.isTrue(StrUtil.isNotBlank(filePath), "文件路径不能为空");
			
			//兼容下没有/的
			filePath = filePath.startsWith("/") ? filePath : "/" + filePath;
			
			Resource resource =  new PathMatchingResourcePatternResolver().getResource(filePath);
			
			return resource == null ? null : resource.getFile();
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new BusinessException(e.getMessage());
		}
		
	}
	
	/**
	 * @function 获取resource资源目录下的所有文件
	 * @param dirPath 目录路径 , 以/开始
	 * @author 肖荣辉
	 * @date 2023年12月20日
	*/
	public static List<File> loadFiles(String dirPath){
		
		XAssert.isTrue(StrUtil.isNotBlank(dirPath), "目录路径不能为空");
		
		//兼容下没有/的
		dirPath = dirPath.startsWith("/") ? dirPath : "/" + dirPath;
		
		Resource[] resources = null;
		
		try {
			
			//只有spring的通配符才可以获取到目录下的文件
			resources = new PathMatchingResourcePatternResolver().getResources(dirPath + "/*");
			
			List<File> fileList = new ArrayList<File>();
			
			for(Resource item : resources) {
				fileList.add(item.getFile());
			}
			
			return fileList;
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new BusinessException(e.getMessage());
		}
		
	}
	
	
	
	/**
	 * @function 在images下的指定目录下加载imageIcon数组(图片名字必须是按数字顺序来的)
	 * @author 肖荣辉
	 * @date 2023年11月5日
	*/
	public static ImageIcon[] loadImageIcons(String dirName) {
		
		Resource[] resources = null;
		
		try {
			//只有spring的通配符才可以获取到目录下的文件
			resources = new PathMatchingResourcePatternResolver().getResources("/images/"+dirName+"/*");
		} catch (IOException e) {
			e.printStackTrace();
			throw new BusinessException(e.getMessage());
		}
		
		List<String> fileNameList = new ArrayList<String>();
		
		Map<String, Resource> fileNameResourceMap = new HashMap<String, Resource>();
		
		for(Resource item : resources) {
			fileNameList.add(item.getFilename());
			fileNameResourceMap.put(item.getFilename(), item);
		}
		
		CollUtil.sort(fileNameList , new Comparator<String>() {

			@Override
			public int compare(String aStr, String bStr) {
				
				int a = Integer.parseInt(aStr.substring(0 , aStr.indexOf(".")));
				int b = Integer.parseInt(bStr.substring(0 , bStr.indexOf(".")));
				
				return a == b ? 0 : (a < b ? -1 : 1);
			}
			
		});
		
		ImageIcon[] images = new ImageIcon[fileNameList.size()];
		
		for(int i = 0 ; i < fileNameList.size() ; i ++) {
			try {
				images[i] = new ImageIcon(fileNameResourceMap.get(fileNameList.get(i)).getURL());
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		return images;
		
	}

	/**
	 * @function 放大缩小长度
	 * @author 肖荣辉
	 * @date 2023年11月5日
	*/
	public static int scaleLen(int length , double scale) {
		return (int)(length * scale);
	}
}
